package com.ikas.ai.server.aop;

import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 可分页标识
 * <p>
 * 详情请参照 - PageableAop
 */
@SuppressWarnings("all")
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pageable {

    /**
     * 自动触发分页 - 默认自动使用AOP进行分页
     * <p>
     * false表示不自动触发，
     * 即aop跳过分页逻辑及导出逻辑，并将相关分页参数存入线程变量中，
     * 同时，需要使用者显示调用AOP方法中的分页方法，在该方法中进行分页
     * <p>
     * 由于在复杂分页查询中，首次查询，一般不是目标查询，所以需要一种可手动调用的方式触发分页
     */
    boolean autoTrigger() default true;

    /**
     * 排序类型
     * <p>
     * asc 正序
     * <p>
     * desc 倒序
     */
    String sortType() default "asc";

    /**
     * 排序字段 - 可使用驼峰命名
     */
    String sortBy() default "id";

    /**
     * 可导出标识，则需要显式指定导出的实体类是什么
     */
    Excel exportable() default @Excel(Object.class);

    /**
     * Excel导出注解
     */
    @interface Excel {

        /**
         * 导出表实体类型
         */
        Class<?> value();

        /**
         * 设置文件名称
         */
        String file() default "file";

        /**
         * 设置标题，空则不设置
         */
        String title() default "";

        /**
         * 设置sheet名称
         */
        String sheet() default "";

        /**
         * 导出表实体类型
         */
        ExcelType excelType() default ExcelType.XSSF;

        /**
         * 是否需要表头，默认需要
         */
        boolean needHeader() default true;

        /**
         * 列宽自适应
         */
        boolean autoSize() default true;
    }
}
